home *** CD-ROM | disk | FTP | other *** search
/ Info-Mac 3 / Info_Mac_1994-01.iso / Communications / Networks / MailCheck 0.9x / drvr src / mmc_drvr.c < prev    next >
C/C++ Source or Header  |  1990-08-06  |  4KB  |  257 lines

  1. /*
  2.  * MacMailWatch driver
  3.  * By Aaron Wohl (aw0g+@andrew.cmu.edu)
  4.  * Carnegie-Mellon University
  5.  * Pittsburgh, PA 15213-3890
  6.  * (412)-268-5032
  7.  */
  8.  
  9.  
  10. #define jIODone 0x8fc
  11.  
  12. void o_glue(void);
  13. void c_glue(void);
  14. void p_glue(void);
  15. void s_glue(void);
  16. void cntrl_glue(void);
  17.  
  18. void header(void);
  19. void header()
  20. {
  21.     /* do NOT add or subtract any fields */
  22.     asm {
  23.         DC.W dNeedLock|dCtlEnable|dNeedTime            /* drvrFlags */
  24.         DC.W 60*3                                    /* drvrDelay */
  25.         DC.W updateEvt                                /* drvrEMask */
  26.         DC.W 0                                        /* drvrMenu  */
  27.         DC.W 42                                        /* open */
  28.         DC.W 48                                        /* prime */
  29.         DC.W 54                                        /* control */
  30.         DC.W 66                                        /* status */
  31.         DC.W 60                                        /* close */
  32.         dc.b "\p.MacMailCheck"
  33.         DC.L 0                                        /* storage for a4 (offset 24) */
  34.         dc.l 0
  35.     }
  36. }
  37.  
  38. /* do not modify */
  39. void open_code(void);
  40. void open_code()
  41. {
  42.     asm {
  43.         bra o_glue
  44.     }
  45. }
  46.  
  47. /* do not modify */
  48. void prime_code(void);
  49. void prime_code()
  50. {
  51.     asm {
  52.         bra p_glue
  53.     }
  54. }
  55.  
  56. /* do not modify */
  57. void control(void);
  58. void control() {
  59.     asm {
  60.         bra cntrl_glue
  61.     }
  62. }
  63.  
  64. /* do not modify */
  65. void close_code(void);
  66. void close_code() {
  67.     asm {
  68.         bra c_glue
  69.     }
  70. }
  71.  
  72. /* do not modify */
  73. void status_code(void);
  74. void status_code()
  75. {
  76.     asm {
  77.         bra s_glue
  78.     }
  79. }
  80.  
  81.  
  82. #include "mmc_core.h"
  83. #include "mmc_core_private.h"
  84. int mmc_control(mmc_io_record_pt pb);
  85.  
  86. LDEF(void cached_strip_mask(void))
  87. {
  88.     asm {
  89.         dc.l 0
  90.         dc.b 0
  91.     }
  92. }
  93.  
  94. LDEF(void clear_strip(void))
  95. {
  96.     asm {
  97.         lea cached_strip_mask,a0
  98.         clr.l (a0)
  99.         clr.b 4(a0)
  100.         rts
  101.     }
  102. }
  103.  
  104. LDEF(void set_strip_mask(void))
  105. {
  106.   asm {
  107.     move.l #-1,d0
  108.     _StripAddress
  109.     lea cached_strip_mask,a0
  110.     move.l d0,(a0)
  111.     move.b #255,4(a0)
  112.     rts
  113.  }
  114. }
  115.  
  116. LDEF(void strip_all(void))
  117. {
  118.     asm {
  119.         lea cached_strip_mask,a0
  120.         tst.b 4(a0)
  121.         bne.s @know_strip
  122.         bsr set_strip_mask
  123. know_strip:
  124.         lea cached_strip_mask,a0
  125.         move.l (a0),d0
  126.         and.l d0,(sp)
  127.         move.l a4,d1
  128.         and.l d0,d1
  129.         move.l d1,a4
  130.         rts
  131.     }
  132. }
  133.  
  134. void driver_exit_func(void);
  135. void driver_exit_func()
  136. {
  137.     asm {
  138.         move.w d0,OFFSET(CntrlParam,ioResult)(a0)
  139.         btst #1,OFFSET(mmc_io_record,ioTrap)(a0) /*is this a queued call? */
  140.         bne.s @notqueued
  141.         move.l jIODone,-(sp)
  142. notqueued:
  143.         rts
  144.     }
  145. }
  146.  
  147. /* glue for close*/
  148. void c_glue()
  149. {
  150.     asm {
  151.         move.l a1,-(sp)        /*a1=dce*/
  152.         move.l a4,-(sp)
  153.         lea header,a4
  154.         move.l a0,-(sp)
  155.         jsr strip_all
  156.         jsr mmc_uninit
  157.         jsr clear_strip
  158.         move.l (sp)+,a0
  159.         move.l (sp)+,a4
  160.         move.l (sp)+,a1        /*a1=dce for jiodone*/
  161.         clr.l d0
  162.         bra driver_exit_func
  163.     }
  164. }
  165.  
  166. /* glue for open*/
  167. void o_glue()
  168. {
  169.     asm {
  170.         move.l a1,-(sp)        /*a1=dce*/
  171.         move.l a4,-(sp)
  172.         lea header,a4
  173.         move.l a0,-(sp)
  174.         jsr strip_all
  175.         jsr mmc_init
  176.         move.l (sp)+,a0
  177.         move.l (sp)+,a4
  178.         move.l (sp)+,a1        /*a1=dce for jiodone*/
  179.         bra driver_exit_func
  180.     }
  181. }
  182.  
  183. /*prime*/
  184. void p_glue()
  185. {
  186.     asm {
  187.         move.l #-19,d0
  188.         bra driver_exit_func
  189.     }
  190. }
  191.  
  192. /*status*/
  193. void s_glue()
  194. {
  195.     asm {
  196.         move.l #-18,d0
  197.         bra driver_exit_func
  198.     }
  199. }
  200.  
  201.  
  202. /* glue for control*/
  203. void cntrl_glue()
  204. {
  205.     asm {
  206.         move.l a1,-(sp)        /*a1=dce*/
  207.         move.l a4,-(sp)
  208.         lea header,a4
  209.         move.l a0,-(sp)
  210.         move.l a0,-(sp)
  211.         jsr strip_all
  212.         jsr mmc_control
  213.         addq.l #4,sp
  214.         move.l (sp)+,a0
  215.         move.l (sp)+,a4
  216.         move.l (sp)+,a1        /*a1=dce for jiodone*/
  217.         bra driver_exit_func
  218.     }
  219. }
  220.  
  221.  
  222. int mmc_control(mmc_io_record_pt pb)
  223. {
  224.     int err=0;
  225.     int err1;
  226.     switch(pb->csCode) {
  227.         case MMC_setmmuser:
  228.              return mmc_setmmuser(&pb->iostate,(mmc_priv_state_pt *)&pb->private_state);
  229.         case MMC_set_state:
  230.         {    err=mmc_set_state(&pb->iostate);
  231.             if(err==MMCE_bad_maj)    /*if version are bad can't return state*/
  232.                 return err;            /*it might trash something*/
  233.             err1=mmc_get_state(&pb->iostate,(mmc_priv_state_pt *)&pb->private_state);
  234.             if(err!=0)
  235.                 return err1;
  236.             else
  237.                 return err;
  238.         }
  239.         case MMC_get_state:
  240.             return mmc_get_state(&pb->iostate,(mmc_priv_state_pt *)&pb->private_state);
  241.             break;
  242.         case MMC_run:
  243.             mmc_tick();
  244.             break;
  245.         case MMC_goodbye:
  246.         case MMC_killio:
  247.             break;
  248.         default:
  249.                 return -17;        /*don't like this control call*/            
  250.     }
  251.     return noErr;
  252. }
  253.  
  254. void main()
  255. {
  256. }
  257.